<?php

/*
 * CREATE VIEW personas AS SELECT p.id_propietario, p.tabla, p.nombres, p.apellidos, d.direccion, d.colonia, d.ciudad, d.estado, d.cp, t.tel_casa, t.tel_trabajo, t.tel_cel, em.email
FROM direcciones AS d
RIGHT JOIN (
telefonos t
RIGHT JOIN (
emails em
RIGHT JOIN persona_nombres p ON p.id_propietario = em.id_propietario
) ON p.id_propietario = t.id_propietario
AND p.tabla = t.tabla
) ON p.id_propietario = d.id_propietario
AND p.tabla = d.tabla 
 */
	
abstract class Persona
{
	var $nombres="";
	var $apellidos="";
	var $direccion="";
	var $telefono="";
	var $id_tabla="";
	
	var $email=null;
	
	#constructor
	function __construct($tipo)
	{
		$this->setIdTabla($tipo);
		
		$this->direccion = new Direccion();
		$this->telefono= new Telefono();
		$this->email=new Email();
		
		//asigna las llaves 
		$this->asignarLlaves();
	}
	
	/*Utilitarias*/
	
	/*
	 * Agregar a la persona
	 * @return void
	 */
	function insertarPersona()
	{
		#agregar el nombres
		new Conexion("INSERT INTO persona_nombres values ('".$this->getId()."','".$this->getIdTabla()."','".$this->getNombres()."','".$this->getApellidos()."')");
		
		$this->asignarLlaves();
				
		#agregar la direccion a la BD
		$this->direccion->insertar();
		
		#agregar el telefono a la BD
		$this->telefono->insertar();
	}
	function cargarPersona()
	{
		$con=new Conexion();
		//cargar a la persona
		
		$we="
		SELECT p.id_propietario, p.tabla, p.nombres,p.apellidos, d.direccion, d.colonia, d.ciudad,d.estado,d.cp, t.tel_casa, t.tel_trabajo, t.tel_cel,em.email 
						FROM direcciones AS d
						RIGHT JOIN ( telefonos t
							RIGHT JOIN ( emails em
								RIGHT JOIN persona_nombres p ON p.id_propietario = em.id_propietario 
							)ON p.id_propietario = t.id_propietario AND p.tabla = t.tabla
						)ON p.id_propietario = d.id_propietario AND p.tabla = d.tabla
			WHERE p.id_propietario = '".$this->getId()."'
			AND p.tabla = '".$this->getIdTabla()."';";

/*	
		$we="select * from personas p where p.id_propietario = '".$this->getId()."'
			AND p.tabla = '".$this->getIdTabla()."'";
		*/
		$con->ejecutar($we);

		//echo $we;
		//asigna las llaves 
		$this->asignarLlaves();
		
		if($con->traerFilaPorNombre())
		{
			$this->setNombres($con->get("nombres"));
			$this->setApellidos($con->get("apellidos"));
			$this->setDireccion($con->get("direccion"),$con->get("colonia"),$con->get("ciudad"),$con->get("estado"),$con->get("cp"));
			$this->setTelefono($con->get("tel_casa"),$con->get("tel_trabajo"),$con->get("tel_cel"));
			$this->email->set($con->get("email"));
		}
	}
	function editarPersona()
	{
		//la llave primaria esta vacia
		if($this->vacio())
			return false;
			
		#editar el nombres
		$this->editarNombres($this->getNombres());
		
		$this->asignarLlaves();	
		
		# direccion a la BD
		$this->direccion->editar(toHtml($_POST['txtDireccion']),"Oaxaca");
		
		#telefono a la BD
		$this->telefono->editar($_POST['txtTelefono']);
	}	
	function eliminarPersona()
	{
		//la llave primaria esta vacia
		if($this->vacio())
			return false;
				
		$this->asignarLlaves();	
		
		# direccion a la BD
		$this->direccion->eliminar();
		
		#telefono a la BD
		$this->telefono->eliminar();
		
		#eliminar el nombres
		new Conexion("delete from persona_nombres where id_propietario='".$this->getId()."' and tabla='".$this->getIdTabla()."';");
	}

	
	/*Utilitarias*/
	function vacio()
	{
		if(trim($this->getId()) == ""  ||  trim($this->getIdTabla()) == "")
			return true;#no existe o es vacio
		else
			return false;
	}
	//le asigna las llaves primarias a los elementos internos
	function asignarLlaves()
	{
		$this->direccion->setIdPropietario($this->getId());
		$this->direccion->setIdTabla($this->id_tabla);

		$this->telefono->setIdPropietario($this->getId());
		$this->telefono->setIdTabla($this->id_tabla);
		$this->email->setId($this->getId());
	}
	
		/*busca en la base de datos las coincidencias con el nombre en dos atributos: NOMBRES & APELLIDOS*/
	function buscarNombre($nombre)//recibe la cadena del nombre completo que va a buscar pe. josue eli hernandez gomez
	{	
		//conectarse
		$num_cad=substr_count($nombre,' ')+1;//cuenta el numero de palabras que hay en la cadena. pe 4 en el anteriro caso
		$cadenas=explode(" ",$nombre);//hacer un arreglo y en cada posicion una palabra.
	/*
		Implemento un algoritmo de busqueda:
		supongase 'josue eli hernandez gomez'
		nosotros sabemos que NOMBRES: josue eli
							APELLIDOS: hernandez gomez entonces.
		
		buscar todas las coincidencias de la siguiente manera
		
		1.	NOMBRE: josue eli hernandez gomez 				||
		2.	APELLIDOS: josue eli hernandez gomez			||
		3.	NOMBRE: josue && APELLIDOS: eli hernandez gomez	||
		4.	NOMRBE: josue eli && APELLIDOS: hernandez gomez	||
		5.	NOMBRE: josue eli hernandez && APELLIDOS: gomez	
	*/
		
		$query= "((pn.nombres like '%$nombre%') or (pn.apellidos like '%$nombre%') ";
	
		for($i=0; $i<$num_cad-1; $i++)
		{//para cada una de las palabras
			$query.= "or (pn.nombres like '%";
			for($j=0; $j<$i+1; $j++)
				if($j==$i)
					$query.= $cadenas[$j]."%' and pn.apellidos like '%";
				else
					$query.= $cadenas[$j]." ";

			for($j=$i+1; $j<$num_cad; $j++)
				if($j==$num_cad-1)
					$query.= $cadenas[$j]."%') ";
				else
					$query.= $cadenas[$j]." ";
		}//fin de "para cada una de las palabras"
		
		for($i=0; $i<$num_cad-1; $i++)
		{//para cada una de las palabras
			$query.= "or (pn.apellidos like '%";
			for($j=0; $j<$i+1; $j++)
				if($j==$i)
					$query.= $cadenas[$j]."%' and pn.nombres like '%";
				else
					$query.= $cadenas[$j]." ";

			for($j=$i+1; $j<$num_cad; $j++)
				if($j==$num_cad-1)
					$query.= $cadenas[$j]."%') ";
				else
					$query.= $cadenas[$j]." ";
		}//fin de "para cada una de las palabras"

		$query.=") ";
		return $query;
	}//fin de 	function buscarNombre()
	
	
	/*funciones SET y GET*/
	function setNombres($_x){$this->nombres= (trim($_x)=="" || $_x=="null" || $_x==null) ?"" : trim($_x);}
	function setApellidos($_x){$this->apellidos= (trim($_x)=="" || $_x=="null" || $_x==null) ?"" : trim($_x);}
	function getNombre(){return $this->getNombres()." ".$this->getApellidos();}
	function setIdTabla($_x){$this->id_tabla=(trim($_x)=="" || $_x=="null" || $_x==null) ?"" : trim($_x);}
	
	function getNombres(){return $this->nombres;}
	function getIdTabla(){return $this->id_tabla;}
	function getApellidos(){return $this->apellidos;}
	
	function setDireccion($a,$colo,$ci,$edo,$cp){
		$this->direccion->setDireccion($a);
		$this->direccion->setColonia($colo);
		$this->direccion->setCiudad($ci);
		$this->direccion->setEstado($edo);
		$this->direccion->setCp($cp);
	}

	function direccionToJson(){
		return $this->direccion->toJson();
	}
	
	function setTelefono($tc,$tt,$tce)
	{
		$this->telefono->setTelefonoCasa($tc);
		$this->telefono->setTelefonoTrabajo($tt);
		$this->telefono->setTelefonoCel($tce);
	}
	function getTelefono()
	{
		return $this->telefono->toString();
	}
	function telefonoToJson()
	{
		return $this->telefono->toJson();
	}

	function editarNombres($_x){
		if($_x != $this->getNombres())
		{ 
			$this->setNombres($_x);
			new Conexion("UPDATE persona_nombres SET nombres='".$this->getNombres()."' where id_propietario='".$this->getId()."' and tabla='".$this->getIdTabla()."';");
		}
	}
	function editarApellidos($_x){
		if($_x != $this->apellidos)
		{
			$this->setApellidos($_x);
			new Conexion("UPDATE persona_nombres SET apellidos='".$this->getApellidos()."' where id_propietario='".$this->getId()."' and tabla='".$this->getIdTabla()."';");
		}
	}

	function editarDireccion($a,$colo,$ci,$edo,$cp){
		//echo $a ." != ". $this->direccion->getDireccion();
		//echo "+".$a." - ".$colo." - ".$ci." - ".$edo." - ".$cp;
		$this->direccion->editar($a,$colo,$ci,$edo,$cp);
	}

	function editarTelefono($tc,$tt,$tce){
		$this->telefono->editar($tc,$tt,$tce);
	}	

	function editarEmail($x){
		if($x != $this->getEmail()){
			$this->email->setId($this->getId());
			$this->email->editar(trim($x));
		}
	}
	
	/*Definicion de funciones abstractas*/
	abstract function setId($_x);
	abstract function getId();
	function setEmail($_x){$s=(trim($_x)=="" || $_x=="null" || $_x==null) ?"" : trim($_x);$this->email->set($s);}
	function getEmail(){return $this->email->get();}
	
	abstract function insertar();
	abstract function editar();
	abstract function eliminar();
}
?>
